package services

import (
	"context"
	"encoding/json"
	"fmt"
	"net/url"
	"strings"

	"gitee.com/wangshh_123/cross-pay-go/src/platform/providers/photonpay"
	"gitee.com/wangshh_123/cross-pay-go/src/platform/providers/photonpay/models"
)

// GetCardholderList 查询用卡人列表
func GetCardholderList(ctx context.Context, client *photonpay.PhotonPayClient, params models.CardholderQueryParams) (*models.CardholderListResponse, error) {
	query := url.Values{}
	if params.PageIndex > 0 {
		query.Set("pageIndex", fmt.Sprintf("%d", params.PageIndex))
	}
	if params.PageSize > 0 {
		query.Set("pageSize", fmt.Sprintf("%d", params.PageSize))
	}
	if params.MemberID != "" {
		query.Set("memberId", params.MemberID)
	}
	if params.MatrixAccount != "" {
		query.Set("matrixAccount", params.MatrixAccount)
	}
	if params.CreatedAtStart != "" {
		query.Set("createdAtStart", params.CreatedAtStart)
	}
	if params.CreatedAtEnd != "" {
		query.Set("createdAtEnd", params.CreatedAtEnd)
	}
	if params.CardholderID != "" {
		query.Set("cardholderId", params.CardholderID)
	}
	if params.Status != "" {
		query.Set("status", params.Status)
	}
	if params.Name != "" {
		// 将名字转换为大写，因为API返回的名字都是大写的
		query.Set("name", strings.ToUpper(params.Name))
	}
	if params.FirstName != "" {
		// 将firstName转换为大写
		query.Set("firstName", strings.ToUpper(params.FirstName))
	}
	if params.LastName != "" {
		// 将lastName转换为大写
		query.Set("lastName", strings.ToUpper(params.LastName))
	}

	path := "/vcc/openApi/v4/pagingVccCardholder"
	if len(query) > 0 {
		path += "?" + query.Encode()
	}

	// 打印请求URL，用于调试
	fmt.Printf("Request URL: %s\n", path)

	resp, err := client.Get(ctx, path)
	if err != nil {
		// 尝试解析错误响应
		var errorResp struct {
			Code string `json:"code"`
			Msg  string `json:"msg"`
		}
		if err := json.Unmarshal([]byte(err.Error()), &errorResp); err == nil {
			errorResponse := struct {
				Code string `json:"code"`
				Msg  struct {
					CN string `json:"cn"`
					EN string `json:"en"`
					VN string `json:"vn"`
				} `json:"msg"`
				Data struct {
					CN string `json:"cn"`
					EN string `json:"en"`
					VN string `json:"vn"`
				} `json:"data"`
			}{
				Code: "500",
				Msg: struct {
					CN string `json:"cn"`
					EN string `json:"en"`
					VN string `json:"vn"`
				}{
					CN: "获取持卡人列表失败",
					EN: "Failed to get cardholder list",
					VN: "Không thể lấy danh sách người giữ thẻ",
				},
				Data: struct {
					CN string `json:"cn"`
					EN string `json:"en"`
					VN string `json:"vn"`
				}{
					CN: fmt.Sprintf("API调用权限不足: %s", errorResp.Msg),
					EN: fmt.Sprintf("Insufficient API permissions: %s", errorResp.Msg),
					VN: fmt.Sprintf("Không đủ quyền gọi API: %s", errorResp.Msg),
				},
			}
			errorBytes, _ := json.Marshal(errorResponse)
			return nil, fmt.Errorf("%s", string(errorBytes))
		}

		// 如果无法解析错误响应，返回通用错误
		errorResponse := struct {
			Code string `json:"code"`
			Msg  struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			} `json:"msg"`
			Data struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			} `json:"data"`
		}{
			Code: "500",
			Msg: struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			}{
				CN: "获取持卡人列表失败",
				EN: "Failed to get cardholder list",
				VN: "Không thể lấy danh sách người giữ thẻ",
			},
			Data: struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			}{
				CN: fmt.Sprintf("获取持卡人列表失败: %v", err),
				EN: fmt.Sprintf("Failed to get cardholder list: %v", err),
				VN: fmt.Sprintf("Không thể lấy danh sách người giữ thẻ: %v", err),
			},
		}
		errorBytes, _ := json.Marshal(errorResponse)
		return nil, fmt.Errorf("%s", string(errorBytes))
	}

	var result models.CardholderListResponse
	if err := json.Unmarshal(resp, &result); err != nil {
		errorResponse := struct {
			Code string `json:"code"`
			Msg  struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			} `json:"msg"`
			Data struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			} `json:"data"`
		}{
			Code: "500",
			Msg: struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			}{
				CN: "获取持卡人列表失败",
				EN: "Failed to get cardholder list",
				VN: "Không thể lấy danh sách người giữ thẻ",
			},
			Data: struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			}{
				CN: fmt.Sprintf("解析响应失败: %v", err),
				EN: fmt.Sprintf("Failed to parse response: %v", err),
				VN: fmt.Sprintf("Không thể phân tích phản hồi: %v", err),
			},
		}
		errorBytes, _ := json.Marshal(errorResponse)
		return nil, fmt.Errorf("%s", string(errorBytes))
	}

	if result.Code != "0000" {
		errorResponse := struct {
			Code string `json:"code"`
			Msg  struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			} `json:"msg"`
			Data struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			} `json:"data"`
		}{
			Code: "500",
			Msg: struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			}{
				CN: "获取持卡人列表失败",
				EN: "Failed to get cardholder list",
				VN: "Không thể lấy danh sách người giữ thẻ",
			},
			Data: struct {
				CN string `json:"cn"`
				EN string `json:"en"`
				VN string `json:"vn"`
			}{
				CN: fmt.Sprintf("获取持卡人列表失败: %s", result.Msg),
				EN: fmt.Sprintf("Failed to get cardholder list: %s", result.Msg),
				VN: fmt.Sprintf("Không thể lấy danh sách người giữ thẻ: %s", result.Msg),
			},
		}
		errorBytes, _ := json.Marshal(errorResponse)
		return nil, fmt.Errorf("%s", string(errorBytes))
	}

	return &result, nil
}

// AddCardholder 添加用卡人，bodyBytes 用于签名和请求体
func AddCardholder(ctx context.Context, client *photonpay.PhotonPayClient, bodyBytes []byte) ([]byte, error) {
	path := "/vcc/openApi/v4/addCardholder"

	resp, err := client.PostWithRawBody(ctx, path, bodyBytes)
	fmt.Print("参数", ctx, path, string(bodyBytes))
	if err != nil {
		return nil, fmt.Errorf("add cardholder failed: %v", err)
	}
	return resp, nil
}

// EditCardholder 用卡人更新，bodyBytes 用于签名和请求体
func EditCardholder(ctx context.Context, client *photonpay.PhotonPayClient, bodyBytes []byte) ([]byte, error) {
	path := "/vcc/openApi/v4/editCardholder"

	resp, err := client.PostWithRawBody(ctx, path, bodyBytes)
	fmt.Print("参数", ctx, path, string(bodyBytes))
	if err != nil {
		return nil, fmt.Errorf("edit cardholder failed: %v", err)
	}
	return resp, nil
}
